iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
0
Mobile Development

顏色 countenance APP製作筆記系列 第 13

[Day 13] Firestore資料存取

  • 分享至 

  • xImage
  •  

了解Cloud Firestore的運作後,終於要使用Xcode存取使用者資料了!以下介紹Xcode中常用的Cloud Firestore存取,其中包含儲存、讀取和刪除資料的方式

撰寫Firestore資料存取程式

參考資料:https://firebase.google.com/docs/firestore/quickstart?authuser=4#ios_1

  1. 點擊Xcode專案資料夾中的「Podfile」檔案,確認是否有「pod 'Firebase/Firestore'」
    https://ithelp.ithome.com.tw/upload/images/20200924/20130458UXHkhUB4TU.png

  2. 開啟「(專案名稱).xcworkspace」檔案,點擊想要使用功能的swift檔,於檔案最上方輸入「import Firebase」,並於class中輸入「let db = Firestore.firestore()」

import Firebase
//class ViewController: UIVViewController {
    let db = Firestore.firestore()
    // ...
//}
  1. 指定欲存取的檔案位置

(1) 設定集合為指定位置

let usersCollectionRef = db.collection("users")

(2) 設定集合中的文件為指定位置

let alovelaceDocumentRef = db.collection("users").document("alovelace")

(3) 設定子集合中的文件為指定位置

let messageRef = db.collection("rooms").document("roomA").collection("messages").document("message1")
  • collection("集合名稱")和document("文件名稱")雙引號內名稱務必和Firestore資料庫內的名稱相同
  1. 儲存資料

(1) 建立文件

// Add a new document in collection "cities"
db.collection("cities").document("LA").setData([
   "name": "Los Angeles",
   "state": "CA",
   "country": "USA"
]) { err in
   if let err = err {
       print("Error writing document: \(err)")
   } else {
       print("Document successfully written!")
   }
}
  • 使用setData()建立文件,如果指定位置的文件不存在時,會根據位置創建新的文件;若文件存在時,新文件資料會完全覆蓋舊文件資料
    https://ithelp.ithome.com.tw/upload/images/20200924/201304585yL6BSxBjd.png

(2) 添加文件資料

// Update one field, creating the document if it does not exist.
db.collection("cities").document("LA").setData([ "capital": true ], merge: true)
  • 不想覆蓋原文件資料時,在setData()內的後方輸入「, merge: true」,新增的文件資料會加入舊資料中
    https://ithelp.ithome.com.tw/upload/images/20200924/20130458R0dqhmICKG.png

(3) 建立自動生成文件ID的資料

// Add a new document with a generated id.
var ref: DocumentReference? = nil
ref = db.collection("cities").addDocument(data: [
   "name": "Tokyo",
   "country": "Japan"
]) { err in
   if let err = err {
       print("Error adding document: \(err)")
   } else {
       print("Document added with ID: \(ref!.documentID)")
   }
}
  • 有時文件名稱沒有意義,這時可以使用addDocument()讓Firestore自動生成文件ID
    https://ithelp.ithome.com.tw/upload/images/20200924/20130458iGd62nyB8X.png

(4) 更新文件

// update the "capital" field of the city 'LA'
db.collection("cities").document("LA").updateData([
   "capital": false
]) { err in
   if let err = err {
       print("Error updating document: \(err)")
   } else {
       print("Document successfully updated")
   }
}
  • 若只需更新部分舊文件資料時,在updateData()中輸入欲更新的欄位名稱和新值來更新文件
    https://ithelp.ithome.com.tw/upload/images/20200924/20130458SRKuF2O1vz.png
  1. 讀取資料

(1) 讀取單個文件

let docRef = db.collection("cities").document("LA")
docRef.getDocument { (document, error) in
   if let document = document, document.exists {
       let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
       print("Document data: \(dataDescription)")
   } else {
       print("Document does not exist")
   }
}
  • 若文件內容為空時,exists會回傳false
  • map()會把所有文件資料放入陣列當中,String.init(describing:)表示文件資料會以「欄位:值」的字串儲存
    https://ithelp.ithome.com.tw/upload/images/20200924/201304583WHgsBMNqv.jpg

(2) 讀取集合中的所有文件

db.collection("cities").getDocuments() { (querySnapshot, err) in
   if let err = err {
       print("Error getting documents: \(err)")
   } else {
       for document in querySnapshot!.documents {
           print("\(document.documentID) => \(document.data())")
       }
   }
}
  • querySnapshot物件可以透過documents方式取得文件檔名和資料
    https://ithelp.ithome.com.tw/upload/images/20200924/20130458uKjtFvdgT9.jpg
  1. 刪除資料

(1) 刪除文件

db.collection("cities").document("LA").delete() { err in
    if let err = err {
        print("Error removing document: \(err)")
    } else {
        print("Document successfully removed!")
    }
}

(2) 刪除文件資料

db.collection("cities").document("LA").updateData([
    "capital": FieldValue.delete(),
]) { err in
    if let err = err {
        print("Error updating document: \(err)")
    } else {
        print("Document successfully updated")
    }
}
  • 在updateData()中,輸入欲刪除的欄位名稱,並於值的地方輸入「FieldValue.delete()」,整個文件資料會被刪除(欄位和值)

上一篇
[Day 12] 建立Firestore資料庫
下一篇
[Day 14] Core Data設定
系列文
顏色 countenance APP製作筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言